home *** CD-ROM | disk | FTP | other *** search
- /* $Copyright:
- *
- * Copyright 1998-2000 by the Massachusetts Institute of Technology.
- *
- * All rights reserved.
- *
- * Export of this software from the United States of America may require a
- * specific license from the United States Government. It is the
- * responsibility of any person or organization contemplating export to
- * obtain such a license before exporting.
- *
- * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and distribute
- * this software and its documentation for any purpose and without fee is
- * hereby granted, provided that the above copyright notice appear in all
- * copies and that both that copyright notice and this permission notice
- * appear in supporting documentation, and that the name of M.I.T. not be
- * used in advertising or publicity pertaining to distribution of the
- * software without specific, written prior permission. Furthermore if you
- * modify this software you must label your software as modified software
- * and not distribute it in such a fashion that it might be confused with
- * the original MIT software. M.I.T. makes no representations about the
- * suitability of this software for any purpose. It is provided "as is"
- * without express or implied warranty.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
- * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Individual source code files are copyright MIT, Cygnus Support,
- * OpenVision, Oracle, Sun Soft, FundsXpress, and others.
- *
- * Project Athena, Athena, Athena MUSE, Discuss, Hesiod, Kerberos, Moira,
- * and Zephyr are trademarks of the Massachusetts Institute of Technology
- * (MIT). No commercial use of these trademarks may be made without prior
- * written permission of MIT.
- *
- * "Commercial use" means use of a name in a product or other for-profit
- * manner. It does NOT prevent a commercial firm from referring to the MIT
- * trademarks in order to convey information (although in doing so,
- * recognition of their trademark status should be given).
- * $
- */
-
- /* $Header: /cvs/macdev/mit/lib/SocketsLib/ClassicGlue/SocketsLib.glue.c,v 1.3 2001/03/21 01:49:00 meeroh Exp $ */
-
- #include <CodeFragments.h>
- #include <Gestalt.h>
- #include <Errors.h>
-
- #include <KerberosSupport/Sockets.h>
- #include <KerberosSupport/netdb.h>
- #include <SocketsLib.glue.h>
-
- /* These functions must obey CFM calling conventions. Functions which return
- pointers must return them in D0, not A0 like ThinkC static 68k does. This way
- we can call CFM functions by pointer from here (if they are called by pointer
- then the compiler can't tell ahead of time to do D0->A0 translation because it
- doesn't know what calling convention the functions use).
-
- Note that if it is necessary (if you don't use MPWC calling conventions)
- the D0->A0 translation will be done by the compiler in the places where
- the application calls these glue routines. */
- #pragma d0_pointers on
-
- /* Hardcode library fragment name here */
- #define kLibraryName "\pMIT Support•SocketsLib"
-
- /* Private function prototypes */
-
- static OSErr Find_Symbol(
- Ptr* pSymAddr,
- Str255 pSymName,
- ProcInfoType pProcInfo);
-
- static pascal Boolean HaveCFM(void);
-
- static pascal OSErr GetSystemArchitecture(OSType *archType);
-
-
- /* This code is directly from Technote 1077 */
- /* changed Library name to be hardcoded at the top of the file
- instead in the middle of the code */
-
- /* Private functions */
-
- static pascal OSErr GetSystemArchitecture(OSType *archType)
- {
- static long sSysArchitecture = 0; // static so we only Gestalt once.
- OSErr tOSErr = noErr;
-
- *archType = kAnyCFragArch; // assume wild architecture
-
- // If we don't know the system architecture yet...
- if (sSysArchitecture == 0)
- // ...Ask Gestalt what kind of machine we are running on.
- tOSErr = Gestalt(gestaltSysArchitecture, &sSysArchitecture);
-
- if (tOSErr == noErr) // if no errors
- {
- if (sSysArchitecture == gestalt68k) // 68k?
- *archType = kMotorola68KCFragArch;
- else if (sSysArchitecture == gestaltPowerPC) // PPC?
- *archType = kPowerPCCFragArch;
- else
- tOSErr = gestaltUnknownErr; // who knows what might be next?
- }
- return tOSErr;
- }
-
- static pascal Boolean HaveCFM(void)
- {
- long response;
- return ( (Gestalt (gestaltCFMAttr, &response) == noErr) &&
- (((response >> gestaltCFMPresent) & 1) != 0));
- }
-
- static OSErr Find_Symbol(
- Ptr* pSymAddr,
- Str255 pSymName,
- ProcInfoType pProcInfo)
- {
- static CFragConnectionID sCID = 0;
- static OSType sArchType = kAnyCFragArch;
- static OSErr sOSErr = noErr;
-
- Str255 errMessage;
- Ptr mainAddr;
- CFragSymbolClass symClass;
- ISAType tISAType;
-
- if (sArchType == kAnyCFragArch) // if architecture is undefined...
- {
- sCID = 0; // ...force (re)connect to library
- sOSErr = GetSystemArchitecture(&sArchType); // determine architecture
- if (sOSErr != noErr)
- return sOSErr; // OOPS!
- }
-
- if (!HaveCFM()) {
- // If we don't have CFM68K, return a reasonable-looking error.
- sOSErr = cfragLibConnErr;
- return sOSErr;
- }
-
- if (sArchType == kMotorola68KCFragArch) // ...for CFM68K
- tISAType = kM68kISA | kCFM68kRTA;
- else if (sArchType == kPowerPCCFragArch) // ...for PPC CFM
- tISAType = kPowerPCISA | kPowerPCRTA;
- else
- sOSErr = gestaltUnknownErr; // who knows what might be next?
-
- if (sCID == 0) // If we haven't connected to the library yet...
- {
- // NOTE: The library name is hard coded here.
- // I try to isolate the glue code, one file per library.
- // I have had developers pass in the Library name to allow
- // plug-in type support. Additional code has to be added to
- // each entry points glue routine to support multiple or
- // switching connection IDs.
- sOSErr = GetSharedLibrary(kLibraryName, sArchType, kLoadCFrag,
- &sCID, &mainAddr, errMessage);
- if (sOSErr != noErr)
- return sOSErr; // OOPS!
- }
-
- // If we haven't looked up this symbol yet...
- if ((Ptr) *pSymAddr == (Ptr) kUnresolvedCFragSymbolAddress)
- {
- // ...look it up now
- sOSErr = FindSymbol(sCID,pSymName,pSymAddr,&symClass);
- if (sOSErr != noErr) // in case of error...
- // ...clear the procedure pointer
- *(Ptr*) &pSymAddr = (Ptr) kUnresolvedCFragSymbolAddress;
- # if !GENERATINGCFM // if this is classic 68k code...
- *pSymAddr = (Ptr)NewRoutineDescriptorTrap((ProcPtr) *pSymAddr,
- pProcInfo, tISAType); // ...create a routine descriptor...
- # endif
- }
- return sOSErr;
- }
-
-
- /* CFM Glue Code for exported functions! */
-
- /**** AbortSocketOperation ****/
- /* OSStatus AbortSocketOperation(int sockFD); */
-
- enum {
- AbortSocketOperation_ProcInfo = kThinkCStackBased
- | RESULT_SIZE(SIZE_CODE(sizeof(OSStatus)))
- | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(int)))
- };
-
-
- typedef OSStatus (*AbortSocketOperation_ProcPtrType)(int);
- OSStatus AbortSocketOperation (int sockFD)
- {
- static AbortSocketOperation_ProcPtrType AbortSocketOperation_ProcPtr = kUnresolvedCFragSymbolAddress;
-
- // if this symbol has not been setup yet...
- if((Ptr) AbortSocketOperation_ProcPtr == (Ptr) kUnresolvedCFragSymbolAddress)
- Find_Symbol((Ptr *) &AbortSocketOperation_ProcPtr, "\pAbortSocketOperation", AbortSocketOperation_ProcInfo);
- if((Ptr) AbortSocketOperation_ProcPtr != (Ptr) kUnresolvedCFragSymbolAddress)
- return AbortSocketOperation_ProcPtr(sockFD);
- }
-
-
- /**** AbortAllDNSOperations ****/
- /* OSStatus AbortAllDNSOperations(void); */
-
- enum {
- AbortAllDNSOperations_ProcInfo = kThinkCStackBased
- | RESULT_SIZE(SIZE_CODE(sizeof(OSStatus)))
-
- };
-
-
- typedef OSStatus (*AbortAllDNSOperations_ProcPtrType)(void);
- OSStatus AbortAllDNSOperations (void)
- {
- static AbortAllDNSOperations_ProcPtrType AbortAllDNSOperations_ProcPtr = kUnresolvedCFragSymbolAddress;
-
- // if this symbol has not been setup yet...
- if((Ptr) AbortAllDNSOperations_ProcPtr == (Ptr) kUnresolvedCFragSymbolAddress)
- Find_Symbol((Ptr *) &AbortAllDNSOperations_ProcPtr, "\pAbortAllDNSOperations", AbortAllDNSOperations_ProcInfo);
- if((Ptr) AbortAllDNSOperations_ProcPtr != (Ptr) kUnresolvedCFragSymbolAddress)
- return AbortAllDNSOperations_ProcPtr();
- }
-
-
- /**** IsValidSocket ****/
- /* Boolean IsValidSocket(int sockFD); */
-
- enum {
- IsValidSocket_ProcInfo = kThinkCStackBased
- | RESULT_SIZE(SIZE_CODE(sizeof(Boolean)))
- | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(int)))
- };
-
-
- typedef Boolean (*IsValidSocket_ProcPtrType)(int);
- Boolean IsValidSocket (int sockFD)
- {
- static IsValidSocket_ProcPtrType IsValidSocket_ProcPtr = kUnresolvedCFragSymbolAddress;
-
- // if this symbol has not been setup yet...
- if((Ptr) IsValidSocket_ProcPtr == (Ptr) kUnresolvedCFragSymbolAddress)
- Find_Symbol((Ptr *) &IsValidSocket_ProcPtr, "\pIsValidSocket", IsValidSocket_ProcInfo);
- if((Ptr) IsValidSocket_ProcPtr != (Ptr) kUnresolvedCFragSymbolAddress)
- return IsValidSocket_ProcPtr(sockFD);
- }
-
-
- /**** socket ****/
- /* int socket(int family, int type, int protocol); */
-
- enum {
- socket_ProcInfo = kThinkCStackBased
- | RESULT_SIZE(SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(int)))
- };
-
-
- typedef int (*socket_ProcPtrType)(int, int, int);
- int socket (int family,
- int type,
- int protocol)
- {
- static socket_ProcPtrType socket_ProcPtr = kUnresolvedCFragSymbolAddress;
-
- // if this symbol has not been setup yet...
- if((Ptr) socket_ProcPtr == (Ptr) kUnresolvedCFragSymbolAddress)
- Find_Symbol((Ptr *) &socket_ProcPtr, "\psocket", socket_ProcInfo);
- if((Ptr) socket_ProcPtr != (Ptr) kUnresolvedCFragSymbolAddress)
- return socket_ProcPtr(family, type, protocol);
- }
-
-
- /**** socket_bind ****/
- /* int socket_bind(int sockFD, const struct sockaddr *myAddr, int addrLength); */
-
- enum {
- socket_bind_ProcInfo = kThinkCStackBased
- | RESULT_SIZE(SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(const struct sockaddr *)))
- | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(int)))
- };
-
-
- typedef int (*socket_bind_ProcPtrType)(int, const struct sockaddr *, int);
- int socket_bind (int sockFD,
- const struct sockaddr * myAddr,
- int addrLength)
- {
- static socket_bind_ProcPtrType socket_bind_ProcPtr = kUnresolvedCFragSymbolAddress;
-
- // if this symbol has not been setup yet...
- if((Ptr) socket_bind_ProcPtr == (Ptr) kUnresolvedCFragSymbolAddress)
- Find_Symbol((Ptr *) &socket_bind_ProcPtr, "\psocket_bind", socket_bind_ProcInfo);
- if((Ptr) socket_bind_ProcPtr != (Ptr) kUnresolvedCFragSymbolAddress)
- return socket_bind_ProcPtr(sockFD, myAddr, addrLength);
- }
-
-
- /**** socket_fcntl ****/
- /* int socket_fcntl(int sockFD, int command, int flags); */
-
- enum {
- socket_fcntl_ProcInfo = kThinkCStackBased
- | RESULT_SIZE(SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(int)))
- };
-
-
- typedef int (*socket_fcntl_ProcPtrType)(int, int, int);
- int socket_fcntl (int sockFD,
- int command,
- int flags)
- {
- static socket_fcntl_ProcPtrType socket_fcntl_ProcPtr = kUnresolvedCFragSymbolAddress;
-
- // if this symbol has not been setup yet...
- if((Ptr) socket_fcntl_ProcPtr == (Ptr) kUnresolvedCFragSymbolAddress)
- Find_Symbol((Ptr *) &socket_fcntl_ProcPtr, "\psocket_fcntl", socket_fcntl_ProcInfo);
- if((Ptr) socket_fcntl_ProcPtr != (Ptr) kUnresolvedCFragSymbolAddress)
- return socket_fcntl_ProcPtr(sockFD, command, flags);
- }
-
-
- /**** socket_close ****/
- /* int socket_close(int sockFD); */
-
- enum {
- socket_close_ProcInfo = kThinkCStackBased
- | RESULT_SIZE(SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(int)))
- };
-
-
- typedef int (*socket_close_ProcPtrType)(int);
- int socket_close (int sockFD)
- {
- static socket_close_ProcPtrType socket_close_ProcPtr = kUnresolvedCFragSymbolAddress;
-
- // if this symbol has not been setup yet...
- if((Ptr) socket_close_ProcPtr == (Ptr) kUnresolvedCFragSymbolAddress)
- Find_Symbol((Ptr *) &socket_close_ProcPtr, "\psocket_close", socket_close_ProcInfo);
- if((Ptr) socket_close_ProcPtr != (Ptr) kUnresolvedCFragSymbolAddress)
- return socket_close_ProcPtr(sockFD);
- }
-
-
- /**** socket_shutdown ****/
- /* int socket_shutdown(int sockFD, int howTo); */
-
- enum {
- socket_shutdown_ProcInfo = kThinkCStackBased
- | RESULT_SIZE(SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(int)))
- };
-
-
- typedef int (*socket_shutdown_ProcPtrType)(int, int);
- int socket_shutdown (int sockFD,
- int howTo)
- {
- static socket_shutdown_ProcPtrType socket_shutdown_ProcPtr = kUnresolvedCFragSymbolAddress;
-
- // if this symbol has not been setup yet...
- if((Ptr) socket_shutdown_ProcPtr == (Ptr) kUnresolvedCFragSymbolAddress)
- Find_Symbol((Ptr *) &socket_shutdown_ProcPtr, "\psocket_shutdown", socket_shutdown_ProcInfo);
- if((Ptr) socket_shutdown_ProcPtr != (Ptr) kUnresolvedCFragSymbolAddress)
- return socket_shutdown_ProcPtr(sockFD, howTo);
- }
-
-
- /**** socket_connect ****/
- /* int socket_connect(int sockFD, struct sockaddr *servAddr, int addrLength); */
-
- enum {
- socket_connect_ProcInfo = kThinkCStackBased
- | RESULT_SIZE(SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(struct sockaddr *)))
- | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(int)))
- };
-
-
- typedef int (*socket_connect_ProcPtrType)(int, struct sockaddr *, int);
- int socket_connect (int sockFD,
- struct sockaddr * servAddr,
- int addrLength)
- {
- static socket_connect_ProcPtrType socket_connect_ProcPtr = kUnresolvedCFragSymbolAddress;
-
- // if this symbol has not been setup yet...
- if((Ptr) socket_connect_ProcPtr == (Ptr) kUnresolvedCFragSymbolAddress)
- Find_Symbol((Ptr *) &socket_connect_ProcPtr, "\psocket_connect", socket_connect_ProcInfo);
- if((Ptr) socket_connect_ProcPtr != (Ptr) kUnresolvedCFragSymbolAddress)
- return socket_connect_ProcPtr(sockFD, servAddr, addrLength);
- }
-
-
- /**** socket_select ****/
- /* int socket_select(int maxFDsExamined, fd_set *readFDs, fd_set *writeFDs, fd_set *exceptFDs, struct timeval *timeOut); */
-
- enum {
- socket_select_ProcInfo = kThinkCStackBased
- | RESULT_SIZE(SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(fd_set *)))
- | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(fd_set *)))
- | STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(fd_set *)))
- | STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof(struct timeval *)))
- };
-
-
- typedef int (*socket_select_ProcPtrType)(int, fd_set *, fd_set *, fd_set *, struct timeval *);
- int socket_select (int maxFDsExamined,
- fd_set * readFDs,
- fd_set * writeFDs,
- fd_set * exceptFDs,
- struct timeval * timeOut)
- {
- static socket_select_ProcPtrType socket_select_ProcPtr = kUnresolvedCFragSymbolAddress;
-
- // if this symbol has not been setup yet...
- if((Ptr) socket_select_ProcPtr == (Ptr) kUnresolvedCFragSymbolAddress)
- Find_Symbol((Ptr *) &socket_select_ProcPtr, "\psocket_select", socket_select_ProcInfo);
- if((Ptr) socket_select_ProcPtr != (Ptr) kUnresolvedCFragSymbolAddress)
- return socket_select_ProcPtr(maxFDsExamined, readFDs, writeFDs, exceptFDs, timeOut);
- }
-
-
- /**** socket_getpeername ****/
- /* int socket_getpeername(int sockFD, struct sockaddr *peerAddr, int *addrLength); */
-
- enum {
- socket_getpeername_ProcInfo = kThinkCStackBased
- | RESULT_SIZE(SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(struct sockaddr *)))
- | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(int *)))
- };
-
-
- typedef int (*socket_getpeername_ProcPtrType)(int, struct sockaddr *, int *);
- int socket_getpeername (int sockFD,
- struct sockaddr * peerAddr,
- int * addrLength)
- {
- static socket_getpeername_ProcPtrType socket_getpeername_ProcPtr = kUnresolvedCFragSymbolAddress;
-
- // if this symbol has not been setup yet...
- if((Ptr) socket_getpeername_ProcPtr == (Ptr) kUnresolvedCFragSymbolAddress)
- Find_Symbol((Ptr *) &socket_getpeername_ProcPtr, "\psocket_getpeername", socket_getpeername_ProcInfo);
- if((Ptr) socket_getpeername_ProcPtr != (Ptr) kUnresolvedCFragSymbolAddress)
- return socket_getpeername_ProcPtr(sockFD, peerAddr, addrLength);
- }
-
-
- /**** socket_getsockname ****/
- /* int socket_getsockname(int sockFD, struct sockaddr *localAddr, int *addrLength); */
-
- enum {
- socket_getsockname_ProcInfo = kThinkCStackBased
- | RESULT_SIZE(SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(struct sockaddr *)))
- | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(int *)))
- };
-
-
- typedef int (*socket_getsockname_ProcPtrType)(int, struct sockaddr *, int *);
- int socket_getsockname (int sockFD,
- struct sockaddr * localAddr,
- int * addrLength)
- {
- static socket_getsockname_ProcPtrType socket_getsockname_ProcPtr = kUnresolvedCFragSymbolAddress;
-
- // if this symbol has not been setup yet...
- if((Ptr) socket_getsockname_ProcPtr == (Ptr) kUnresolvedCFragSymbolAddress)
- Find_Symbol((Ptr *) &socket_getsockname_ProcPtr, "\psocket_getsockname", socket_getsockname_ProcInfo);
- if((Ptr) socket_getsockname_ProcPtr != (Ptr) kUnresolvedCFragSymbolAddress)
- return socket_getsockname_ProcPtr(sockFD, localAddr, addrLength);
- }
-
-
- /**** socket_read ****/
- /* int socket_read(int sockFD, void *buffer, UInt32 numBytes); */
-
- enum {
- socket_read_ProcInfo = kThinkCStackBased
- | RESULT_SIZE(SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(void *)))
- | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(UInt32)))
- };
-
-
- typedef int (*socket_read_ProcPtrType)(int, void *, UInt32);
- int socket_read (int sockFD,
- void * buffer,
- UInt32 numBytes)
- {
- static socket_read_ProcPtrType socket_read_ProcPtr = kUnresolvedCFragSymbolAddress;
-
- // if this symbol has not been setup yet...
- if((Ptr) socket_read_ProcPtr == (Ptr) kUnresolvedCFragSymbolAddress)
- Find_Symbol((Ptr *) &socket_read_ProcPtr, "\psocket_read", socket_read_ProcInfo);
- if((Ptr) socket_read_ProcPtr != (Ptr) kUnresolvedCFragSymbolAddress)
- return socket_read_ProcPtr(sockFD, buffer, numBytes);
- }
-
-
- /**** socket_write ****/
- /* int socket_write(int sockFD, void *buffer, UInt32 numBytes); */
-
- enum {
- socket_write_ProcInfo = kThinkCStackBased
- | RESULT_SIZE(SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(void *)))
- | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(UInt32)))
- };
-
-
- typedef int (*socket_write_ProcPtrType)(int, void *, UInt32);
- int socket_write (int sockFD,
- void * buffer,
- UInt32 numBytes)
- {
- static socket_write_ProcPtrType socket_write_ProcPtr = kUnresolvedCFragSymbolAddress;
-
- // if this symbol has not been setup yet...
- if((Ptr) socket_write_ProcPtr == (Ptr) kUnresolvedCFragSymbolAddress)
- Find_Symbol((Ptr *) &socket_write_ProcPtr, "\psocket_write", socket_write_ProcInfo);
- if((Ptr) socket_write_ProcPtr != (Ptr) kUnresolvedCFragSymbolAddress)
- return socket_write_ProcPtr(sockFD, buffer, numBytes);
- }
-
-
- /**** socket_readv ****/
- /* int socket_readv(int sockFD, struct iovec *iov, UInt32 iovCount); */
-
- enum {
- socket_readv_ProcInfo = kThinkCStackBased
- | RESULT_SIZE(SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(struct iovec *)))
- | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(UInt32)))
- };
-
-
- typedef int (*socket_readv_ProcPtrType)(int, struct iovec *, UInt32);
- int socket_readv (int sockFD,
- struct iovec * iov,
- UInt32 iovCount)
- {
- static socket_readv_ProcPtrType socket_readv_ProcPtr = kUnresolvedCFragSymbolAddress;
-
- // if this symbol has not been setup yet...
- if((Ptr) socket_readv_ProcPtr == (Ptr) kUnresolvedCFragSymbolAddress)
- Find_Symbol((Ptr *) &socket_readv_ProcPtr, "\psocket_readv", socket_readv_ProcInfo);
- if((Ptr) socket_readv_ProcPtr != (Ptr) kUnresolvedCFragSymbolAddress)
- return socket_readv_ProcPtr(sockFD, iov, iovCount);
- }
-
-
- /**** socket_writev ****/
- /* int socket_writev(int sockFD, struct iovec *iov, UInt32 iovCount); */
-
- enum {
- socket_writev_ProcInfo = kThinkCStackBased
- | RESULT_SIZE(SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(struct iovec *)))
- | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(UInt32)))
- };
-
-
- typedef int (*socket_writev_ProcPtrType)(int, struct iovec *, UInt32);
- int socket_writev (int sockFD,
- struct iovec * iov,
- UInt32 iovCount)
- {
- static socket_writev_ProcPtrType socket_writev_ProcPtr = kUnresolvedCFragSymbolAddress;
-
- // if this symbol has not been setup yet...
- if((Ptr) socket_writev_ProcPtr == (Ptr) kUnresolvedCFragSymbolAddress)
- Find_Symbol((Ptr *) &socket_writev_ProcPtr, "\psocket_writev", socket_writev_ProcInfo);
- if((Ptr) socket_writev_ProcPtr != (Ptr) kUnresolvedCFragSymbolAddress)
- return socket_writev_ProcPtr(sockFD, iov, iovCount);
- }
-
-
- /**** socket_recv ****/
- /* int socket_recv(int sockFD, void *buffer, UInt32 numBytes, int flags); */
-
- enum {
- socket_recv_ProcInfo = kThinkCStackBased
- | RESULT_SIZE(SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(void *)))
- | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(UInt32)))
- | STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(int)))
- };
-
-
- typedef int (*socket_recv_ProcPtrType)(int, void *, UInt32, int);
- int socket_recv (int sockFD,
- void * buffer,
- UInt32 numBytes,
- int flags)
- {
- static socket_recv_ProcPtrType socket_recv_ProcPtr = kUnresolvedCFragSymbolAddress;
-
- // if this symbol has not been setup yet...
- if((Ptr) socket_recv_ProcPtr == (Ptr) kUnresolvedCFragSymbolAddress)
- Find_Symbol((Ptr *) &socket_recv_ProcPtr, "\psocket_recv", socket_recv_ProcInfo);
- if((Ptr) socket_recv_ProcPtr != (Ptr) kUnresolvedCFragSymbolAddress)
- return socket_recv_ProcPtr(sockFD, buffer, numBytes, flags);
- }
-
-
- /**** socket_send ****/
- /* int socket_send(int sockFD, void *buffer, UInt32 numBytes, int flags); */
-
- enum {
- socket_send_ProcInfo = kThinkCStackBased
- | RESULT_SIZE(SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(void *)))
- | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(UInt32)))
- | STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(int)))
- };
-
-
- typedef int (*socket_send_ProcPtrType)(int, void *, UInt32, int);
- int socket_send (int sockFD,
- void * buffer,
- UInt32 numBytes,
- int flags)
- {
- static socket_send_ProcPtrType socket_send_ProcPtr = kUnresolvedCFragSymbolAddress;
-
- // if this symbol has not been setup yet...
- if((Ptr) socket_send_ProcPtr == (Ptr) kUnresolvedCFragSymbolAddress)
- Find_Symbol((Ptr *) &socket_send_ProcPtr, "\psocket_send", socket_send_ProcInfo);
- if((Ptr) socket_send_ProcPtr != (Ptr) kUnresolvedCFragSymbolAddress)
- return socket_send_ProcPtr(sockFD, buffer, numBytes, flags);
- }
-
-
- /**** socket_recvfrom ****/
- /* int socket_recvfrom(int sockFD, void *buffer, UInt32 numBytes, int flags, struct sockaddr *fromAddr, socklen_t *addrLength); */
-
- enum {
- socket_recvfrom_ProcInfo = kThinkCStackBased
- | RESULT_SIZE(SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(void *)))
- | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(UInt32)))
- | STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof(struct sockaddr *)))
- | STACK_ROUTINE_PARAMETER(6, SIZE_CODE(sizeof(socklen_t *)))
- };
-
-
- typedef int (*socket_recvfrom_ProcPtrType)(int, void *, UInt32, int, struct sockaddr *, socklen_t *);
- int socket_recvfrom (int sockFD,
- void * buffer,
- UInt32 numBytes,
- int flags,
- struct sockaddr * fromAddr,
- socklen_t * addrLength)
- {
- static socket_recvfrom_ProcPtrType socket_recvfrom_ProcPtr = kUnresolvedCFragSymbolAddress;
-
- // if this symbol has not been setup yet...
- if((Ptr) socket_recvfrom_ProcPtr == (Ptr) kUnresolvedCFragSymbolAddress)
- Find_Symbol((Ptr *) &socket_recvfrom_ProcPtr, "\psocket_recvfrom", socket_recvfrom_ProcInfo);
- if((Ptr) socket_recvfrom_ProcPtr != (Ptr) kUnresolvedCFragSymbolAddress)
- return socket_recvfrom_ProcPtr(sockFD, buffer, numBytes, flags, fromAddr, addrLength);
- }
-
-
- /**** socket_sendto ****/
- /* int socket_sendto(int sockFD, void *buffer, UInt32 numBytes, int flags, struct sockaddr *toAddr, socklen_t addrLength); */
-
- enum {
- socket_sendto_ProcInfo = kThinkCStackBased
- | RESULT_SIZE(SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(void *)))
- | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(UInt32)))
- | STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof(struct sockaddr *)))
- | STACK_ROUTINE_PARAMETER(6, SIZE_CODE(sizeof(socklen_t)))
- };
-
-
- typedef int (*socket_sendto_ProcPtrType)(int, void *, UInt32, int, struct sockaddr *, socklen_t);
- int socket_sendto (int sockFD,
- void * buffer,
- UInt32 numBytes,
- int flags,
- struct sockaddr * toAddr,
- socklen_t addrLength)
- {
- static socket_sendto_ProcPtrType socket_sendto_ProcPtr = kUnresolvedCFragSymbolAddress;
-
- // if this symbol has not been setup yet...
- if((Ptr) socket_sendto_ProcPtr == (Ptr) kUnresolvedCFragSymbolAddress)
- Find_Symbol((Ptr *) &socket_sendto_ProcPtr, "\psocket_sendto", socket_sendto_ProcInfo);
- if((Ptr) socket_sendto_ProcPtr != (Ptr) kUnresolvedCFragSymbolAddress)
- return socket_sendto_ProcPtr(sockFD, buffer, numBytes, flags, toAddr, addrLength);
- }
-
-
- /**** inet_ntoa ****/
- /* char* inet_ntoa(struct in_addr addr); */
-
- enum {
- inet_ntoa_ProcInfo = kThinkCStackBased
- | RESULT_SIZE(SIZE_CODE(sizeof(char*)))
- | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(struct in_addr)))
- };
-
-
- typedef char* (*inet_ntoa_ProcPtrType)(struct in_addr);
- char* inet_ntoa (struct in_addr addr)
- {
- static inet_ntoa_ProcPtrType inet_ntoa_ProcPtr = kUnresolvedCFragSymbolAddress;
-
- // if this symbol has not been setup yet...
- if((Ptr) inet_ntoa_ProcPtr == (Ptr) kUnresolvedCFragSymbolAddress)
- Find_Symbol((Ptr *) &inet_ntoa_ProcPtr, "\pinet_ntoa", inet_ntoa_ProcInfo);
- if((Ptr) inet_ntoa_ProcPtr != (Ptr) kUnresolvedCFragSymbolAddress)
- return inet_ntoa_ProcPtr(addr);
- }
-
-
- /**** inet_aton ****/
- /* int inet_aton(const char *str, struct in_addr *addr); */
-
- enum {
- inet_aton_ProcInfo = kThinkCStackBased
- | RESULT_SIZE(SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(const char *)))
- | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(struct in_addr *)))
- };
-
-
- typedef int (*inet_aton_ProcPtrType)(const char *, struct in_addr *);
- int inet_aton (const char * str,
- struct in_addr * addr)
- {
- static inet_aton_ProcPtrType inet_aton_ProcPtr = kUnresolvedCFragSymbolAddress;
-
- // if this symbol has not been setup yet...
- if((Ptr) inet_aton_ProcPtr == (Ptr) kUnresolvedCFragSymbolAddress)
- Find_Symbol((Ptr *) &inet_aton_ProcPtr, "\pinet_aton", inet_aton_ProcInfo);
- if((Ptr) inet_aton_ProcPtr != (Ptr) kUnresolvedCFragSymbolAddress)
- return inet_aton_ProcPtr(str, addr);
- }
-
-
- /**** inet_addr ****/
- /* in_addr_t inet_addr(const char *str); */
-
- enum {
- inet_addr_ProcInfo = kThinkCStackBased
- | RESULT_SIZE(SIZE_CODE(sizeof(in_addr_t)))
- | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(const char *)))
- };
-
-
- typedef in_addr_t (*inet_addr_ProcPtrType)(const char *);
- in_addr_t inet_addr (const char * str)
- {
- static inet_addr_ProcPtrType inet_addr_ProcPtr = kUnresolvedCFragSymbolAddress;
-
- // if this symbol has not been setup yet...
- if((Ptr) inet_addr_ProcPtr == (Ptr) kUnresolvedCFragSymbolAddress)
- Find_Symbol((Ptr *) &inet_addr_ProcPtr, "\pinet_addr", inet_addr_ProcInfo);
- if((Ptr) inet_addr_ProcPtr != (Ptr) kUnresolvedCFragSymbolAddress)
- return inet_addr_ProcPtr(str);
- }
-
-
- /**** inet_pton ****/
- /* int inet_pton(int family, const char *str, void *addr); */
-
- enum {
- inet_pton_ProcInfo = kThinkCStackBased
- | RESULT_SIZE(SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(const char *)))
- | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(void *)))
- };
-
-
- typedef int (*inet_pton_ProcPtrType)(int, const char *, void *);
- int inet_pton (int family,
- const char * str,
- void * addr)
- {
- static inet_pton_ProcPtrType inet_pton_ProcPtr = kUnresolvedCFragSymbolAddress;
-
- // if this symbol has not been setup yet...
- if((Ptr) inet_pton_ProcPtr == (Ptr) kUnresolvedCFragSymbolAddress)
- Find_Symbol((Ptr *) &inet_pton_ProcPtr, "\pinet_pton", inet_pton_ProcInfo);
- if((Ptr) inet_pton_ProcPtr != (Ptr) kUnresolvedCFragSymbolAddress)
- return inet_pton_ProcPtr(family, str, addr);
- }
-
-
- /**** inet_ntop ****/
- /* const char* inet_ntop(int family, const void *addr, char *str, size_t len); */
-
- enum {
- inet_ntop_ProcInfo = kThinkCStackBased
- | RESULT_SIZE(SIZE_CODE(sizeof(const char*)))
- | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(const void *)))
- | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(char *)))
- | STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(size_t)))
- };
-
-
- typedef const char* (*inet_ntop_ProcPtrType)(int, const void *, char *, size_t);
- const char* inet_ntop (int family,
- const void * addr,
- char * str,
- size_t len)
- {
- static inet_ntop_ProcPtrType inet_ntop_ProcPtr = kUnresolvedCFragSymbolAddress;
-
- // if this symbol has not been setup yet...
- if((Ptr) inet_ntop_ProcPtr == (Ptr) kUnresolvedCFragSymbolAddress)
- Find_Symbol((Ptr *) &inet_ntop_ProcPtr, "\pinet_ntop", inet_ntop_ProcInfo);
- if((Ptr) inet_ntop_ProcPtr != (Ptr) kUnresolvedCFragSymbolAddress)
- return inet_ntop_ProcPtr(family, addr, str, len);
- }
-
-
- /**** gethostbyname ****/
- /* struct hostent* gethostbyname(const char *hostname); */
-
- enum {
- gethostbyname_ProcInfo = kThinkCStackBased
- | RESULT_SIZE(SIZE_CODE(sizeof(struct hostent*)))
- | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(const char *)))
- };
-
-
- typedef struct hostent* (*gethostbyname_ProcPtrType)(const char *);
- struct hostent* gethostbyname (const char * hostname)
- {
- static gethostbyname_ProcPtrType gethostbyname_ProcPtr = kUnresolvedCFragSymbolAddress;
-
- // if this symbol has not been setup yet...
- if((Ptr) gethostbyname_ProcPtr == (Ptr) kUnresolvedCFragSymbolAddress)
- Find_Symbol((Ptr *) &gethostbyname_ProcPtr, "\pgethostbyname", gethostbyname_ProcInfo);
- if((Ptr) gethostbyname_ProcPtr != (Ptr) kUnresolvedCFragSymbolAddress)
- return gethostbyname_ProcPtr(hostname);
- }
-
-
- /**** gethostbyaddr ****/
- /* struct hostent* gethostbyaddr(const char *addr, size_t len, int family); */
-
- enum {
- gethostbyaddr_ProcInfo = kThinkCStackBased
- | RESULT_SIZE(SIZE_CODE(sizeof(struct hostent*)))
- | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(const char *)))
- | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(size_t)))
- | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(int)))
- };
-
-
- typedef struct hostent* (*gethostbyaddr_ProcPtrType)(const char *, size_t, int);
- struct hostent* gethostbyaddr (const char * addr,
- size_t len,
- int family)
- {
- static gethostbyaddr_ProcPtrType gethostbyaddr_ProcPtr = kUnresolvedCFragSymbolAddress;
-
- // if this symbol has not been setup yet...
- if((Ptr) gethostbyaddr_ProcPtr == (Ptr) kUnresolvedCFragSymbolAddress)
- Find_Symbol((Ptr *) &gethostbyaddr_ProcPtr, "\pgethostbyaddr", gethostbyaddr_ProcInfo);
- if((Ptr) gethostbyaddr_ProcPtr != (Ptr) kUnresolvedCFragSymbolAddress)
- return gethostbyaddr_ProcPtr(addr, len, family);
- }
-
-
- /**** gethostname ****/
- /* int gethostname(char *name, size_t namelen); */
-
- enum {
- gethostname_ProcInfo = kThinkCStackBased
- | RESULT_SIZE(SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(char *)))
- | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(size_t)))
- };
-
-
- typedef int (*gethostname_ProcPtrType)(char *, size_t);
- int gethostname (char * name,
- size_t namelen)
- {
- static gethostname_ProcPtrType gethostname_ProcPtr = kUnresolvedCFragSymbolAddress;
-
- // if this symbol has not been setup yet...
- if((Ptr) gethostname_ProcPtr == (Ptr) kUnresolvedCFragSymbolAddress)
- Find_Symbol((Ptr *) &gethostname_ProcPtr, "\pgethostname", gethostname_ProcInfo);
- if((Ptr) gethostname_ProcPtr != (Ptr) kUnresolvedCFragSymbolAddress)
- return gethostname_ProcPtr(name, namelen);
- }
-
-
- /**** getservent ****/
- /* struct servent* getservent (void); */
-
- enum {
- getservent_ProcInfo = kThinkCStackBased
- | RESULT_SIZE(SIZE_CODE(sizeof(struct servent*)))
-
- };
-
-
- typedef struct servent* (*getservent_ProcPtrType)(void);
- struct servent* getservent (void)
- {
- static getservent_ProcPtrType getservent_ProcPtr = kUnresolvedCFragSymbolAddress;
-
- // if this symbol has not been setup yet...
- if((Ptr) getservent_ProcPtr == (Ptr) kUnresolvedCFragSymbolAddress)
- Find_Symbol((Ptr *) &getservent_ProcPtr, "\pgetservent", getservent_ProcInfo);
- if((Ptr) getservent_ProcPtr != (Ptr) kUnresolvedCFragSymbolAddress)
- return getservent_ProcPtr();
- }
-
-
- /**** endservent ****/
- /* void endservent (void); */
-
- enum {
- endservent_ProcInfo = kThinkCStackBased
-
- };
-
-
- typedef void (*endservent_ProcPtrType)(void);
- void endservent (void)
- {
- static endservent_ProcPtrType endservent_ProcPtr = kUnresolvedCFragSymbolAddress;
-
- // if this symbol has not been setup yet...
- if((Ptr) endservent_ProcPtr == (Ptr) kUnresolvedCFragSymbolAddress)
- Find_Symbol((Ptr *) &endservent_ProcPtr, "\pendservent", endservent_ProcInfo);
- if((Ptr) endservent_ProcPtr != (Ptr) kUnresolvedCFragSymbolAddress)
- endservent_ProcPtr();
- }
-
-
- /**** getservbyname ****/
- /* struct servent* getservbyname (const char *servname, const char *protname); */
-
- enum {
- getservbyname_ProcInfo = kThinkCStackBased
- | RESULT_SIZE(SIZE_CODE(sizeof(struct servent*)))
- | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(const char *)))
- | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(const char *)))
- };
-
-
- typedef struct servent* (*getservbyname_ProcPtrType)(const char *, const char *);
- struct servent* getservbyname (const char * servname,
- const char * protname)
- {
- static getservbyname_ProcPtrType getservbyname_ProcPtr = kUnresolvedCFragSymbolAddress;
-
- // if this symbol has not been setup yet...
- if((Ptr) getservbyname_ProcPtr == (Ptr) kUnresolvedCFragSymbolAddress)
- Find_Symbol((Ptr *) &getservbyname_ProcPtr, "\pgetservbyname", getservbyname_ProcInfo);
- if((Ptr) getservbyname_ProcPtr != (Ptr) kUnresolvedCFragSymbolAddress)
- return getservbyname_ProcPtr(servname, protname);
- }
-
-
- /**** getservbyport ****/
- /* struct servent* getservbyport (int port, const char *protname); */
-
- enum {
- getservbyport_ProcInfo = kThinkCStackBased
- | RESULT_SIZE(SIZE_CODE(sizeof(struct servent*)))
- | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(int)))
- | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(const char *)))
- };
-
-
- typedef struct servent* (*getservbyport_ProcPtrType)(int, const char *);
- struct servent* getservbyport (int port,
- const char * protname)
- {
- static getservbyport_ProcPtrType getservbyport_ProcPtr = kUnresolvedCFragSymbolAddress;
-
- // if this symbol has not been setup yet...
- if((Ptr) getservbyport_ProcPtr == (Ptr) kUnresolvedCFragSymbolAddress)
- Find_Symbol((Ptr *) &getservbyport_ProcPtr, "\pgetservbyport", getservbyport_ProcInfo);
- if((Ptr) getservbyport_ProcPtr != (Ptr) kUnresolvedCFragSymbolAddress)
- return getservbyport_ProcPtr(port, protname);
- }
-
-
- Boolean SocketsLibraryIsPresent(void)
- {
- Ptr symAddr;
- return (Find_Symbol (&symAddr, "\psocket", socket_ProcInfo)) == noErr;
- }
-
-
-